#ifndef REPORT_H
#define REPORT_H

#include <QWidget>
#include <QtXml>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QFileDialog>
#include <QGroupBox>
#include <QRadioButton>
#include <QFile>
#include <QByteArray>
#include <QMessageBox>

//Класс расчета
#include "../../trayToolKit/trayToolKit.h"
#include "../toolParts/toolParts.h"
#include "../mainWidgets/groupControl/groupControl.h"
#include "../mainWidgets/termsAndMaterials/termsAndMaterials.h"

#include "../../mainWindow/defines.h"

class Report : public QWidget, public QXmlDefaultHandler {
  Q_OBJECT
public:
  Report(TrayToolKit *mainTtk, ToolParts *mainToolParts, TermsAndMaterials *mainTam, GroupControl *mainGrControl, QWidget *parent = 0);
  
  //Переопределение виртуальных функций для XML-парсинга.
  bool startElement(const QString & namespaceUri, const QString & tagName, const QString & tagNameFull, const QXmlAttributes & attrs);
  bool characters(const QString & strText);
  bool endElement(const QString & namespaceUri, const QString & tagName, const QString & tagNameFull);
  bool fatalError(const QXmlParseException & exception);

  QString saveReport();

protected:
  QString curTag;
  QString curTagValue;
  int curPart;

  //Виджеты
  QLineEdit * lineEdit;
  QPushButton * addShabButton;
  QPushButton * genReportButton;
  QString savePath;
  QGroupBox * fastGroup;
  QGroupBox * shabGroup;
  QRadioButton * fastRButton;
  QRadioButton * shabRButton;
  QLabel * label;

  TrayToolKit * ttk;
  ToolParts * toolParts;
  GroupControl * grControl;
  TermsAndMaterials * tam;

  void replaceVar(QByteArray * fileText);

//Методы для xml-генерации
  QString genHead();
  QString genMain();

  QString genPart(int num);

  QString genTail();

//Методы для генерации отчета
  QString genMainReport();
  QString genPartReport(int num);

  QString genHeadReport();
  QString genTailReport();
  
//Конвертирование кодировки
  QTextCodec * russianCodec;

  //Перевод угла в радианы
  double to_rad(int gr)    { return ((gr * PI) / 180); };
  //Перевод радиан в угол
  int to_gr(double rad)    { return ( int( (rad *180)/PI) ); };

  //Убирает незначащие цифры после запятой
  double toPrec(double num) { double d = fmod(num, 0.01); return  num - d + double(rint(d * 1000))/1000; };
  // double toPrec(double num) { double d = fmod(num, OUTPREC); return num - d; };

public slots:
  void genXmlReport();
  void loadXmlReport();
  void saveXmlPattern();
  void saveAsXmlPattern();

protected slots:
  void callFileDialog();
  void genReport();

signals:
  void callReCalc();
  void newMessage(QString text);
  void resetChanged(bool stat);

}; //class Report : public QWidget

#endif
